package com.tong.hao.common.configuration.filter;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * @ClassName AcFilter
 * @Author 友野浩二
 * @Description 过滤器: 注册器名称为tongFilter,拦截所有url
 * @Version 1.0
 *
 * <pre>
 * 过滤器：
 *      过滤器filter是servlet的一个实用技术。可通过过滤器，对请求进行拦截，比如读取session判断用户
 *      是否登录、判断访问的请求URL是否有访问权限(黑白名单)等。主要还是可对请求进行预处理。
 * 实现方式：
 *      1- 利用WebFilter注解配置
 *          @WebFilter 是servlet3.0新增的注解，原先实现过滤器，需要在web.xml中进行配置，而现在通过
 *      此注解，启动应用时会自动扫描自动注册;
 *          在启动类中加入注解@ServletComponentScan即可。
 * Component注解: 启动类上加了@ServletComponentScan并制定了要扫描的包路径
 * </pre>
 */
@WebFilter(filterName = "haoFilter", urlPatterns = {"/*"})
@Slf4j
public class HaoFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("haoFilter init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        // 对request、response进行一些预处理
        // 比如设置请求响应的编码
        servletRequest.setCharacterEncoding(StandardCharsets.UTF_8.name());
        servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.name());
        // 业务逻辑编写
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        log.info("haoFilter destroy");
    }
}
